// import 引入本地包 从 gopath开始
// 如果包名长 可以给包名取别名 但原来的路径不能使用了
// 只有main包可以编译成 可执行程序 go build -o \bin\my.exe main.go
// 库文件：
// 函数不支持重载
package main

import "fmt"
import u "github.com/study/day01/16_函数/utils"

//全局匿名函数 如果有给别人用 首字母大写
var (
	Fun1 = func(n1 int,n2 int) int{
		return n1 + n2
	}

)

func main(){

	result := u.Cal(3.12,23,'+')
	fmt.Println("result=",result)

	//多结果返回
	v1,v2 := cal2(22.0,23.0)
	fmt.Println("v1=",v1,"v2=",v2)
	//忽略不要的
	var v3,_ = cal2(222.0,23.0)
	fmt.Println("v3=",v3)

	//函数也是一种数据类型
	var c = cal2
	fmt.Println(c(2.2,322.2))

	fdv := funcDemo(cal,1,2)
	fmt.Println(fdv)


	//自定义数据类型
	type myInt int
	var myn1 myInt
	myn1 = 32
	fmt.Println("myn1=",myn1)
	
	var nn1 int
	nn1 = int(myn1)
	fmt.Println("nn1=",nn1)

	fmt.Println(demo3(2,33))
	
	fmt.Println(demo4(1,2,3,4,5))

	//匿名函数
	var nimingv int = func (n1 int,n2 int) int{
		return n1 + n2
	}(10,29)
	fmt.Println("niminv",nimingv)

	niminghanshu := func(n1 int ,n2 int) int {
		return n1 + n2
	}
	fmt.Println(niminghanshu(11,11))

	fmt.Println("全局匿名",Fun1(22,22))
}



//myFunc 是个函数类型 可以作为形参使用
type myFunc func(int,int)int


func demo2(p1 myFunc) {
	fmt.Println("s")
}


//对函数返回值命名  可以直接返回
func demo3(n1 int, n2 int) (r1 int ,r2 int){
	r1 = n1 + n2
	r2 = n1 - n2
	return 
}



//两个返回值
func cal2(n1 float64 , n2 float64) (float64,float64){
	return n1+n2,n1-n2
}

func cal(n1 float64 , n2 float64) (float64){
	return n1+n2
}

//接收函数
func funcDemo( func1 func(float64,float64) float64,n1 int,n2 int) float64{
	return func1(float64(n1),float64(n2))
}


//可变参数 求多个参数和
func demo4(n1 int,n2... int) int{
	sum := n1
	for i:=0;i<len(n2);i++{
		sum += n2[i]
	}
	return sum 
}


//多个形参类型一样可以写到最后面
func demo5(n1,n2,n3 float64,n4 int) float64{
	return n1+ n2 + n3 
}

